Telegram Group & Telegram Channel
💡 Задача: Загадочный Кэш

У тебя есть метод, который возвращает последовательность чисел, вычисляемую с задержкой (например, чтение из удалённого ресурса):


public static IEnumerable<int> GetSlowData()
{
Console.WriteLine("Fetching data...");
yield return 1;
Thread.Sleep(1000);
yield return 2;
Thread.Sleep(1000);
yield return 3;
}

Теперь тебе нужно реализовать метод ProcessData(), который:

Вызывает GetSlowData() один раз.

Проходит по данным дважды: сначала фильтрует только чётные, потом считает сумму всех.

Не должен повторно "запрашивать" данные (то есть Fetching data... должен выводиться один раз).

Не должен использовать ToList(), ToArray() или другие методы, загружающие всё в память явно.

🧠 Вопрос с подвохом: Как реализовать ProcessData()?
Напиши реализацию:


public static void ProcessData()
{
// твой код здесь
}


🔎 Подсказка
Если ты просто используешь IEnumerable<int> и дважды к нему обращаешься — будет два запроса. Но есть один способ реализовать ленивое кэширование, не загружая всё в память сразу и не повторяя yield return.

Решение:

Если ты просто напишешь вот так:

```csharp
var data = GetSlowData();

var evens = data.Where(x => x % 2 == 0);
var sum = data.Sum();```

то GetSlowData() будет вызван дважды, потому что IEnumerable ленивый — и при каждом новом foreach начинается всё заново. Это видно по двойному выводу Fetching data....

🧠 Цель: пройтись по данным один раз, кэшируя элементы "на лету", и позволить другим перечислениям работать без повторного получения.
Решение: Используем ленивый кеш — с помощью кастомного итератора

```csharp
public static void ProcessData()
{
var cached = new MemoizedEnumerable<int>(GetSlowData());

var evens = cached.Where(x => x % 2 == 0);
var sum = cached.Sum();

Console.WriteLine("Even numbers: " + string.Join(", ", evens));
Console.WriteLine("Sum: " + sum);
}```
А вот реализация ленивого кеширующего MemoizedEnumerable<T>:

```csharp
public class MemoizedEnumerable<T> : IEnumerable<T>
{
private readonly IEnumerator<T> _source;
private readonly List<T> _cache = new();
private bool _sourceFinished = false;

public MemoizedEnumerable(IEnumerable<T> source)
{
_source = source.GetEnumerator();
}

public IEnumerator<T> GetEnumerator()
{
int index = 0;
while (true)
{
if (index < _cache.Count)
{
yield return _cache[index];
}
else
{
if (_sourceFinished || !_source.MoveNext())
{
_sourceFinished = true;
yield break;
}

_cache.Add(_source.Current);
yield return _source.Current;
}
index++;
}
}

IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}```

🧪 Что происходит
MemoizedEnumerable запоминает каждый элемент один раз при первом проходе.

Следующие проходы используют кэш.

Fetching data... будет вызван только один раз.

💥 Подвох
Большинство подумает, что IEnumerable можно безопасно переиспользовать без сайд-эффектов. Но не тут-то было: без кэширования yield выполнится дважды. Многие Middle+ разработчики ошибаются именно тут.



tg-me.com/csharp_ci/1334
Create:
Last Update:

💡 Задача: Загадочный Кэш

У тебя есть метод, который возвращает последовательность чисел, вычисляемую с задержкой (например, чтение из удалённого ресурса):


public static IEnumerable<int> GetSlowData()
{
Console.WriteLine("Fetching data...");
yield return 1;
Thread.Sleep(1000);
yield return 2;
Thread.Sleep(1000);
yield return 3;
}

Теперь тебе нужно реализовать метод ProcessData(), который:

Вызывает GetSlowData() один раз.

Проходит по данным дважды: сначала фильтрует только чётные, потом считает сумму всех.

Не должен повторно "запрашивать" данные (то есть Fetching data... должен выводиться один раз).

Не должен использовать ToList(), ToArray() или другие методы, загружающие всё в память явно.

🧠 Вопрос с подвохом: Как реализовать ProcessData()?
Напиши реализацию:


public static void ProcessData()
{
// твой код здесь
}


🔎 Подсказка
Если ты просто используешь IEnumerable<int> и дважды к нему обращаешься — будет два запроса. Но есть один способ реализовать ленивое кэширование, не загружая всё в память сразу и не повторяя yield return.

Решение:

Если ты просто напишешь вот так:

```csharp
var data = GetSlowData();

var evens = data.Where(x => x % 2 == 0);
var sum = data.Sum();```

то GetSlowData() будет вызван дважды, потому что IEnumerable ленивый — и при каждом новом foreach начинается всё заново. Это видно по двойному выводу Fetching data....

🧠 Цель: пройтись по данным один раз, кэшируя элементы "на лету", и позволить другим перечислениям работать без повторного получения.
Решение: Используем ленивый кеш — с помощью кастомного итератора

```csharp
public static void ProcessData()
{
var cached = new MemoizedEnumerable<int>(GetSlowData());

var evens = cached.Where(x => x % 2 == 0);
var sum = cached.Sum();

Console.WriteLine("Even numbers: " + string.Join(", ", evens));
Console.WriteLine("Sum: " + sum);
}```
А вот реализация ленивого кеширующего MemoizedEnumerable<T>:

```csharp
public class MemoizedEnumerable<T> : IEnumerable<T>
{
private readonly IEnumerator<T> _source;
private readonly List<T> _cache = new();
private bool _sourceFinished = false;

public MemoizedEnumerable(IEnumerable<T> source)
{
_source = source.GetEnumerator();
}

public IEnumerator<T> GetEnumerator()
{
int index = 0;
while (true)
{
if (index < _cache.Count)
{
yield return _cache[index];
}
else
{
if (_sourceFinished || !_source.MoveNext())
{
_sourceFinished = true;
yield break;
}

_cache.Add(_source.Current);
yield return _source.Current;
}
index++;
}
}

IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}```

🧪 Что происходит
MemoizedEnumerable запоминает каждый элемент один раз при первом проходе.

Следующие проходы используют кэш.

Fetching data... будет вызван только один раз.

💥 Подвох
Большинство подумает, что IEnumerable можно безопасно переиспользовать без сайд-эффектов. Но не тут-то было: без кэширования yield выполнится дважды. Многие Middle+ разработчики ошибаются именно тут.

BY C# (C Sharp) programming


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/csharp_ci/1334

View MORE
Open in Telegram


C C Sharp programming Telegram | DID YOU KNOW?

Date: |

Telegram and Signal Havens for Right-Wing Extremists

Since the violent storming of Capitol Hill and subsequent ban of former U.S. President Donald Trump from Facebook and Twitter, the removal of Parler from Amazon’s servers, and the de-platforming of incendiary right-wing content, messaging services Telegram and Signal have seen a deluge of new users. In January alone, Telegram reported 90 million new accounts. Its founder, Pavel Durov, described this as “the largest digital migration in human history.” Signal reportedly doubled its user base to 40 million people and became the most downloaded app in 70 countries. The two services rely on encryption to protect the privacy of user communication, which has made them popular with protesters seeking to conceal their identities against repressive governments in places like Belarus, Hong Kong, and Iran. But the same encryption technology has also made them a favored communication tool for criminals and terrorist groups, including al Qaeda and the Islamic State.

If riding a bucking bronco is your idea of fun, you’re going to love what the stock market has in store. Consider this past week’s ride a preview.The week’s action didn’t look like much, if you didn’t know better. The Dow Jones Industrial Average rose 213.12 points or 0.6%, while the S&P 500 advanced 0.5%, and the Nasdaq Composite ended little changed.

C C Sharp programming from hk


Telegram C# (C Sharp) programming
FROM USA